package com.maiko.maikoimagesearchmcpserver.tools;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 图片搜索工具类，用于通过 Pexels API 根据关键词搜索图片。
 * 可集成至 AI Agent 系统中，作为可调用的工具方法。
 *
 * @author: Maiko7
 * @create: 2025-07-09 19:43
 */
@Service // 表示该类是一个 Spring Bean，可被自动注入
public class ImageSearchTool {

    // 替换为你申请的 Pexels API 密钥（https://www.pexels.com/api/）
    private static final String API_KEY = "你的 API Key";

    // Pexels 的图片搜索接口地址（可查询文档确认）
    private static final String API_URL = "https://api.pexels.com/v1/search";

    /**
     * AI Agent 可调用的工具方法：根据关键词搜索图片
     *
     * @param query 搜索关键词（例如 "cat", "sunset"）
     * @return 图片链接列表（以逗号拼接），或错误信息
     */
    @Tool(description = "search image from web") // 标记为 AI 可调用工具
    public String searchImage(@ToolParam(description = "Search query keyword") String query) {
        try {
            // 调用搜索方法，拼接中等尺寸图片地址为字符串返回
            return String.join(",", searchMediumImages(query));
        } catch (Exception e) {
            // 捕获异常并返回错误信息
            return "Error search image: " + e.getMessage();
        }
    }

    /**
     * 实际执行网络请求，搜索中等尺寸图片链接列表
     *
     * @param query 搜索关键词
     * @return 图片 URL 列表（中等尺寸）
     */
    public List<String> searchMediumImages(String query) {
        // 构造请求头，添加 Pexels 授权信息
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", API_KEY);

        // 设置请求参数（目前只传 query，可扩展 page、per_page）
        Map<String, Object> params = new HashMap<>();
        params.put("query", query);

        // 构造并发送 GET 请求
        String response = HttpUtil.createGet(API_URL)
                .addHeaders(headers)  // 添加请求头
                .form(params)         // 添加参数（将自动转换为 ?query=xxx）
                .execute()
                .body();              // 获取响应体字符串

        // 解析 JSON 响应，提取所有中等尺寸图片链接
        return JSONUtil.parseObj(response)                // 将响应字符串解析为 JSON 对象
                .getJSONArray("photos")                  // 获取 "photos" 数组
                .stream()
                .map(photoObj -> (JSONObject) photoObj)  // 转换为 JSONObject
                .map(photoObj -> photoObj.getJSONObject("src"))  // 获取 "src" 对象
                .map(photo -> photo.getStr("medium"))    // 提取 "medium" 尺寸图片链接
                .filter(StrUtil::isNotBlank)             // 过滤空链接
                .collect(Collectors.toList());           // 收集为列表
    }
}


